home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
System Booster
/
System Booster.iso
/
Archives
/
Replacements
/
cpdist_0_17.lha
/
cpdist-0.17
/
source
/
main.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-03-20
|
6KB
|
265 lines
/*
* MAIN.C
*/
/*
* (c)Copyright 1992-93 by Tobias Ferber.
*
* This file is part of CPDIST.
*
* CPDIST is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published
* by the Free Software Foundation; either version 1 of the License,
* or (at your option) any later version.
*
* CPDIST is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with CPDIST; see the file COPYING. If not, write to
* the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include "cpdist.h"
#include "filecopy.h"
/* globals */
unsigned long global_opts; /* command-line options */
long global_buffersize; /* size of our copy buffer */
void display_version_information(void)
{
static char license[]=
"CPDIST is free software; you can redistribute it and/or modify\n"
"it under the terms of the GNU General Public License as published\n"
"by the Free Software Foundation; either version 1 of the License,\n"
"or (at your option) any later version.\n"
"\n"
"CPDIST is distributed in the hope that it will be useful,\n"
"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
"GNU General Public License for more details.\n"
"\n"
"You should have received a copy of the GNU General Public License\n"
"along with CPDIST; see the file COPYING. If not, write to the\n"
"Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.\n"
;
puts("CPDIST Version " VERSION " (compiled " __DATE__ ", " __TIME__ ")\n"
"(c)Copyright 1992-93 by Tobias Ferber, <ukjg@rz.uni-karlsruhe.de>\n");
puts(license);
}
int main(int argc, char **argv)
{
int badopt= 0;
/* these are safe in here */
char distfile[MAXIMUM_PATHNAME_LENGTH];
char destination[MAXIMUM_PATHNAME_LENGTH];
int haveapath= 0;
#ifdef __MSDOS__
/* filenames on MS-DOS systems look very ugly: all uppercase and
* backslashes. Perform some cosmetics. */
whoami= "cpdist";
#else /* !__MSDOS__ */
whoami= argv[0];
#endif /* __MSDOS__ */
/* this is where the echo()d messages go to */
ferr= stderr;
strcpy(distfile, DEFAULT_DISTFILE);
/* init the globals */
global_opts= 0L;
global_buffersize= MAXIMUM_BUFFERSIZE;
while(--argc>0 && !badopt)
{
char *arg= *(++argv);
if(*arg==OPTION_PREFIX)
{
/* remember the original command-line option string */
char *opt= arg;
if(arg[1]==OPTION_PREFIX)
arg= convert_args(*argv);
switch(*++arg)
{
/*-a*/ case 'a':
global_opts |= OPT_REPLACEALL;
break;
/*-b*/ case 'b':
if(arg[1]) ++arg;
else arg= (--argc > 0) ? *(++argv) : (char *)0L;
if(arg && *arg)
{ global_buffersize= atol(arg);
if(global_buffersize < 0L)
{ echo("Illegal buffer size %ld (must be non-negative)",
global_buffersize);
badopt= 10;
}
#if defined(__TURBOC__)
if(global_buffersize > MAXIMUM_BUFFERSIZE)
{ echo("Buffer size is limited to %dK. Will use this upper limit.",
MAXIMUM_BUFFERSIZE/1024);
}
#endif /* __TURBOC__ */
}
else
{ echo("Missing buffer size after '%s' option",opt);
badopt= 10;
}
break;
/*-c*/ case 'c':
global_opts |= OPT_CHECKEXISTS;
break;
/*-D*/ case 'D':
if(arg[1]) ++arg;
else arg= (--argc > 0) ? *(++argv) : (char *)0L;
if(arg && *arg)
{ if(!ln_addnode(arg))
{ echo("Not enough bits in the system free pool!");
badopt= 10;
}
}
else
{ echo("Missing distribution key after '%s' option.",opt);
badopt= 10;
}
break;
/*-E*/ case 'E':
if(arg[1]) ++arg;
else arg= (--argc > 0) ? *(++argv) : (char *)0L;
if(arg && *arg)
{ FILE *fp;
if( (fp= fopen(arg,"w")) )
{ if(ferr && ferr!=stderr)
fclose(ferr);
ferr= fp;
}
else
{ perror(whoami);
echo("Can't redirect output to `%s'.",arg);
badopt= 10;
}
}
else
{ echo("Missing filename or device after '%s' option.",opt);
badopt= 10;
}
break;
/*-f*/ case 'f':
if(arg[1]) ++arg;
else arg= (--argc > 0) ? *(++argv) : (char *)0L;
if(arg && *arg)
strcpy(distfile,arg);
else
{ echo("Missing filename after '%s' option", opt);
badopt= 10;
}
break;
/*-?*/ case '?':
/*-h*/ case 'h': case 'H':
display_args();
puts("\nRefer to the docs for further information!");
badopt= 1; /* hack: means exit. */
break;
/*-i*/ case 'i':
global_opts |= OPT_IGNOREERRORS;
break;
/*-k*/ case 'k':
global_opts |= OPT_KEEPGOING;
break;
/*-n*/ case 'n':
global_opts |= OPT_DRYRUN;
break;
/*-q*/ case 'q':
/*-s*/ case 's':
global_opts |= OPT_SILENT;
break;
/*-v*/ case 'v':
display_version_information();
break;
/*..*/ default:
echo("bad option '-%s'.",arg);
badopt= 10;
break;
}
}
else /* pathname */
{
if(*arg)
{
int l= strlen(arg)-1;
if(arg[l]==':' || arg[l]==PSLASH)
strcpy(destination, arg);
else
sprintf(destination,"%s%c",arg,PSLASH);
}
else destination[0]= '\0';
if(haveapath)
{ echo("More than one destination path in your command line.");
echo("Will use %s now.", *destination ? destination : "current directory");
}
else haveapath++;
}
} /* wend */
if(!badopt)
{
if(!haveapath && CP_DRYRUN)
destination[haveapath++]= '\0';
if(haveapath) /* let's roll! */
badopt= prepare_distribution(distfile, destination);
else
{ echo("Missing destination path.");
badopt= 10;
}
}
ln_purge();
#ifdef AMIGA
return badopt ? 5:0;
#else
return badopt ? 1:0;
#endif /* AMIGA */
}